home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Visual Database / Visual Foxpro 6.0 (Ent. Edition) / Vf6ent Extractor.EXE / TOOLS / XSOURCE / XSOURCE.ZIP / vfpsource / wizards / Wzquery / emit.prg next >
Encoding:
Text File  |  1998-05-01  |  10.5 KB  |  376 lines

  1. #include "wzquery.h"
  2. PROCEDURE emit
  3. local noldmaxrecords
  4. external array wzabqtxt
  5.     PRIVATE m.i,m.j,m.wzsTemp,m.wzsTag,m.wzsFldLst,m.wzsDBFs,m.wzsFilt
  6.     EXTERNAL ARRAY wzaQSort,wzaQFlds
  7.     PRIVATE wzdatestamp,wztimestamp,wz_timestamp,m.error
  8.     m.error=0
  9.  
  10.     IF wzlTesting
  11.         * wzaQDD[2,5]='1'
  12.     ENDIF
  13.     CLEAR PROGRAM    &&clear out program cache
  14.     SET TEXTMERGE TO (m.wzsFileName)
  15.     SET TEXTMERGE on NOSHOW
  16.  
  17.     m.wzsDBFs=""
  18.     m.wzsFldLst=""
  19.     FOR m.i=1 TO ALEN(wzaQFlds,1)
  20.         m.wzsFldLst=m.wzsFldLst+wzaQFlds[m.i]+','
  21.     ENDFOR
  22.     m.wzsFldLst=LEFT(m.wzsFldLst,LEN(m.wzsFldLst)-1)
  23.  
  24.     m.wzsFilt=oEngine.cWizFiltExpr
  25.  
  26.     DO EmitSql with "*"
  27.     SET TEXTMERGE TO
  28.     IF oEngine.mDev
  29.         MODI COMM (m.wzsFileName)
  30.     ENDIF
  31.     IF m.qWizType #'R'
  32.         FOR m.i = 1 TO ALEN(wzaQDD,1)
  33.             IF CursorGetProp("sourcetype",wzaQDD[m.i,1]) # 3
  34.                 oEngine.SetErrorOff = .t.
  35.                 =ReQuery(wzaQDD[m.i,1])
  36.                 oEngine.SetErrorOff = .f.
  37.             ENDIF
  38.         ENDFOR
  39.     ENDIF
  40.  
  41.     IF oEngine.lIsPreview
  42.         owizard.form1.visible=.f.
  43.         IF m.qWizType='R'
  44.             LOCAL fp,m.mstr
  45.             fp=FOPEN(m.wzsFileName,0)
  46.             mstr=FREAD(m.fp,5000)
  47.             =fclose(m.fp)
  48.             SELECT wzacsDD_
  49.             m.mstr=STRTRAN(m.mstr,';'+CHR(13)+CHR(10),'')
  50.             noldmaxrecords=CursorgetProp("maxrecords",0)
  51.             =CursorSetProp("maxrecords",100,0)
  52.             =SQLEXEC(oEngine.nConnectHandle,m.mstr,PREVIEW_LOC)
  53.             =CursorSetProp("maxrecords",m.noldmaxrecords,0)
  54.         ELSE
  55.             msaveerr=ON("ERROR")
  56.             ON ERROR m.error=error()
  57.             DO (m.wzsFileName)
  58.             IF m.error>0
  59.                 oEngine.Alert(message())
  60.             ENDIF
  61.             ON ERROR &msaveerr
  62.         ENDIF
  63.         erase (m.wzsFilename)
  64.         erase (LEFT(m.wzsFileName,RAT('.',m.wzsFilename))+"fxp")
  65.         IF m.qWizType='R' and ALIAS()="WZACSDD_"
  66.             oEngine.Alert(C_NO_RECORDS_FOUND_LOC,64)
  67.             m.error=1
  68.         ELSE
  69.             IF m.error=0
  70.                 acti screen
  71.                 SET SKIP OF MENU _MSYSMENU .T.
  72.                 brow last nomenu
  73.                 USE
  74.                 SET SKIP OF MENU _MSYSMENU .F.
  75.             ENDIF
  76.         ENDIF
  77.         owizard.form1.visible=.t.
  78.         
  79. #if .f.
  80.         LOCAL ox
  81.         ox=CREATE("formprev")
  82.         ox.windowtype=1    &&modal
  83.         ox.autocenter=.t.
  84.         ox.grid1.recordsource=alias()
  85.         ox.show
  86.         release ox
  87. #endif
  88.         oWizard.form1.refresh    &&force a repaint
  89.     ENDIF
  90. RETURN
  91.  
  92. PROCEDURE EmitSql
  93.     PARAMETERS prefix    &&'*' for parm block, '!' for CKSQL, '' for normal FPSQL
  94.     PRIVATE m.i,m.wzsSort,m.wzsJoin,m.wzsGrp,m.prefix,m.wzsTemp
  95.     *- added var for cursor name, take from filename
  96.     PRIVATE m.wzlOuter, m.wzscursnam
  97.     LOCAL mtemp,mdbf, aTables[1]
  98.     m.wzscursnam = "Query"
  99.     m.wzsJoin=""
  100.     IF !EMPTY(wzaQGrp[1,1])
  101.         m.wzsGrp=""
  102.         FOR m.i=1 TO ALEN(wzaQGrp,1)
  103.             IF !EMPTY(wzaQGrp[m.i,1])
  104.                 IF VAL(wzaQGrp[m.i,2])>1
  105.                     DO CASE
  106.                     CASE SUBSTR(wzaQGrp[m.i,2],2)='D'
  107.                         DO CASE
  108.                         CASE VAL(wzaQGrp[m.i,2])=2    &&Year
  109.                             m.wzsTemp="YEAR("+wzaQGrp[m.i,1]+")"
  110.                         CASE VAL(wzaQGrp[m.i,2])=3    &&Month
  111.                             m.wzsTemp="MONTH("+wzaQGrp[m.i,1]+")"
  112.                         CASE VAL(wzaQGrp[m.i,2])=4    &&Dow
  113.                             m.wzsTemp="DOW("+wzaQGrp[m.i,1]+")"
  114.                         CASE VAL(wzaQGrp[m.i,2])=5    &&Yr/mn
  115.                             m.wzsTemp="STR(YEAR("+wzaQGrp[m.i,1]+"),4)+'/'+"+;
  116.                                 "STR(MONTH("+wzaQGrp[m.i,1]+"),2)"
  117.                         CASE VAL(wzaQGrp[m.i,2])=6    &&Quarter
  118.                             m.wzsTemp="'Q'+STR(INT((MONTH("+wzaQGrp[m.i,1]+")-1)/3)+1,1)"
  119.                         CASE VAL(wzaQGrp[m.i,2])=7    &&Year/Quarter
  120.                             m.wzsTemp="STR(YEAR("+wzaQGrp[m.i,1]+"),4)"+;
  121.                                 "+'-Q'+STR(INT((MONTH("+wzaQGrp[m.i,1]+")-1)/3)+1,1)"
  122.                         ENDCASE
  123.                     CASE SUBSTR(wzaQGrp[m.i,2],2)='N'
  124.                         m.wzsTemp=VAL(wzaQGrp[m.i,2])-1
  125.                         m.wzsTemp=ALLTRIM(STR(10^m.wzsTemp))
  126.                         m.wzsTemp="INT("+wzaQGrp[m.i,1]+"/"+m.wzsTemp+;
  127.                             ") * "+m.wzsTemp
  128.                     OTHERWISE    &&must be Char
  129.                         m.wzsTemp="LEFT("+wzaQGrp[m.i,1]+","+;
  130.                             STR(VAL(wzaQGrp[m.i,2])-1,1)+')'
  131.                     ENDCASE
  132.                     *- put CR & LF together
  133.                     m.wzsFldLst=m.wzsFldLst+",;"+;
  134.                         CHR(13)+CHR(10)+m.prefix+CHR(9)+CHR(9)+;
  135.                         m.wzsTemp+" AS GRP"+CHR(m.i+ASC('0'))
  136.                     m.wzsGrp=m.wzsGrp+",GRP"+CHR(m.i+ASC('0'))
  137.                 ELSE
  138.                     m.wzsGrp=m.wzsGrp+","+wzaQGrp[m.i,1]
  139.                 ENDIF && wzaQGrp[m.i,2]>1
  140.             ENDIF && !EMPTY(wzaQGrp[m.i,1])
  141.         ENDFOR &&* m.i=1 TO ALEN(wzaQGrp,1)
  142.         m.wzsGrp=SUBSTR(m.wzsGrp,2)
  143.     ENDIF && !EMPTY(wzaQGrp[1,1])    
  144.     
  145.     * create FROM clause, no joins
  146.     DIMENSION aTables[ALEN(wzaQDD,1)]
  147.     m.wzsDBFs = ""
  148.     FOR m.i=1 TO ALEN(wzaQDD,1)
  149.         aTables[m.i] = ""
  150.         DO CASE
  151.         CASE m.prefix='!'
  152.             m.wzsDBFs=m.wzsDBFs+wzaQDD[m.i,6]    &&Just CS name
  153.         CASE m.prefix='*'
  154.             IF m.qwiztype='R'
  155.                 m.wzsDBFs=m.wzsDBFs+wzaQDD[m.i,1]
  156.             ELSE
  157.                 mtemp=CURSORGETPROP("database",wzaQDD[m.i,1])
  158.                 m.mdbf=""
  159.                 IF !EMPTY(m.mtemp)  &&free table
  160.                     m.mdbf=m.mdbf + oEngine.JustStem(m.mtemp)+'!'
  161.                 ENDIF
  162.                 m.mdbf=m.mdbf + CURSORGETPROP("sourcename",wzaQDD[m.i,1])
  163.                 IF at(' ',m.mdbf)>0
  164.                     m.mdbf='"'+m.mdbf+'"'
  165.                 ENDIF
  166.                 m.wzsDBFs=m.wzsDBFs + m.mdbf
  167.  
  168.                 * save table name for JOIN condition
  169.                 aTables[m.i] = m.mdbf
  170.             ENDIF
  171.         OTHERWISE
  172.             m.wzsDBFs=m.wzsDBFs+wzaQDD[m.i,1]
  173.         ENDCASE
  174.         IF m.qwiztype#'R'
  175.             m.wzsDBFs=m.wzsDBFs+' '+wzaQDD[m.i,1]    &&local alias
  176.         ENDIF
  177.         m.wzsDBFs=m.wzsDBFs+','
  178.     ENDFOR
  179.     m.wzsDBFs = LEFT(m.wzsDBFs,LEN(m.wzsDBFs)-1)
  180.     
  181.     * create FROM clause with join clause
  182.     m.wzlOuter = ALEN(wzaQDD,1) = 2 AND ;
  183.                  (VAL(wzaQDD[2,5]) > 0 OR OEngine.nJoinOption > 1)        &&Outer Join for 2 tables
  184.  
  185.     IF m.wzlOuter
  186.         * Join is part of the FROM clause
  187.         m.joinOper = IIF(OEngine.nJoinOption = 2, "LEFT OUTER JOIN", ;
  188.                      IIF(OEngine.nJoinOption = 3, "RIGHT OUTER JOIN", "FULL OUTER JOIN"))
  189.                      
  190.         m.wzsJoin = aTables[1] + " " + wzaQDD[1,1] + " " + m.joinOper + " " + aTables[2] + " " + wzaQDD[2,1] + ;
  191.                     " ON " + JoinCond(wzaQDD[2,3], wzaQDD[2,4]) + " = " + JoinCond(wzaQDD[2,1], wzaQDD[2,2])
  192.  
  193.         * handle remote views with ODBC syntax
  194.         IF m.qWizType='R' AND OEngine.lOdbcJoin
  195.             * for RIGHT JOIN comute to LEFT JOIN to match ODBC syntax
  196.             IF OEngine.nJoinOption = 3 
  197.                 m.wzsJoin = aTables[2] + " " + wzaQDD[2,1] + " LEFT OUTER JOIN " + aTables[1] + " " + wzaQDD[1,1] + ;
  198.                 " ON " + JoinCond(wzaQDD[2,1], wzaQDD[2,2]) + " = " + JoinCond(wzaQDD[2,3], wzaQDD[2,4])
  199.             ENDIF
  200.             IF ATCC("FoxPro",oEngine.cDriver)=0
  201.                 m.wzsJoin = "{oj " + m.wzsJoin + " }"
  202.             ENDIF
  203.         ENDIF
  204.     ELSE
  205.         * INNER Join is added to the FROM clause, except remote view wizard where is added to WHERE clause- AT 04/23/96
  206.         IF ALEN(wzaQDD,1)<2
  207.             m.wzajoin = ''
  208.         ELSE    
  209.             IF m.qWizType = 'R' 
  210.                 FOR m.i = 2 TO ALEN(wzaQDD, 1)
  211.                     m.wzsJoin = m.wzsJoin + IIF(m.i=2, "", " AND ")+ ;
  212.                     JoinCond(wzaQDD[m.i,3],wzaQDD[m.i,4])+' = '+ ;
  213.                     JoinCond(wzaQDD[m.i,1],wzaQDD[m.i,2])
  214.                 ENDFOR
  215.             ELSE
  216.                 m.wzsJoin = BuildInnerJoin(@wzaQDD, @aTables, 2)
  217.             ENDIF
  218.         ENDIF
  219.     ENDIF
  220.     
  221.     * create the Sql query
  222.     DO CASE
  223.     CASE m.QWizType='R' AND !oEngine.lIsPreview
  224.         \CREATE SQL VIEW '<<m.wzsViewName>>' REMOTE CONNECTION '<<oEngine.cConnect>>' AS SELECT 
  225.     CASE m.QWizType='V' AND !oEngine.lIsPreview
  226.         \CREATE SQL VIEW '<<m.wzsViewName>>'  AS SELECT 
  227.     CASE m.QWizType='Q' OR oEngine.lIsPreview
  228.         \SELECT 
  229.     ENDCASE
  230.  
  231.     IF !EMPTY(wzaQSort[1])
  232.         IF OEngine.nAmount != -1
  233.             \\TOP <<TRIM(STR(OEngine.nAmount, 3))>> 
  234.             IF OEngine.nPortion = 1
  235.                 \\PERCENT 
  236.             ENDIF
  237.         ENDIF
  238.     ENDIF
  239.  
  240.     DO OutStr WITH m.Prefix+CHR(9)+CHR(9),m.wzsFldLst,0,1,','
  241.     
  242.     * INNER JOIN is included in FROM for query and local view
  243.     * wzsJoin holds the join conditions. For an ODBC OJ, it's ""
  244.     IF !EMPTY(m.wzsJoin)
  245.         IF m.qwiztype#'R'OR m.wzlOuter
  246.             \    FROM <<m.wzsJoin>>
  247.             m.wzsJoin = ""
  248.         ELSE    &&inner join for remote view
  249.             \    FROM <<m.wzsDBFs>>
  250.         ENDIF
  251.     ELSE
  252.             \    FROM <<m.wzsDBFs>>
  253.     ENDIF
  254.     IF !EMPTY(m.wzsJoin)
  255.         \\;
  256.         \    WHERE <<m.wzsJoin>>
  257.     ENDIF && !EMPTY(m.wzsJoin)
  258.     IF !EMPTY(m.wzsFilt)
  259.         \\;
  260.         \    <<IIF(EMPTY(m.wzsJoin),"WHERE "," AND ")>>
  261.         \\(<<m.wzsFilt>>)
  262.     ENDIF && !EMPTY(wzaQFilt[1,1])
  263.  
  264.     IF !EMPTY(wzaQSort[1])
  265.         m.wzsSort=""
  266.  
  267.         FOR m.i=1 TO ALEN(wzaQSort,1)
  268.             m.wzsSort = IIF(m.i > 1,m.wzsSort+',',"")+wzaQSort[m.i]
  269.             IF m.i = 1 AND m.wziQSortA=2
  270.                 m.wzsSort = m.wzsSort + " DESC "
  271.             ENDIF
  272.         ENDFOR &&* m.i=1 TO ALEN(wzaQSort,1)
  273.         \\;
  274.         \    ORDER BY <<m.wzsSort>>
  275.  
  276.         *copy file (m.wzsFileName) to 'fao.prg'
  277.  
  278.     ENDIF && !EMPTY(wzaQSort[1])
  279.     IF !EMPTY(wzaQGrp[1,1])
  280.         \\;
  281.         \    GROUP BY 
  282.         \\<<m.wzsGrp>>
  283.     ENDIF
  284.     IF oEngine.lIsPreview AND m.QWizType#'R'
  285.         \\;
  286.         \    INTO CURSOR PREVIEW_LOC
  287.     ENDIF
  288.     RETURN
  289. ENDPROC
  290.  
  291. PROCEDURE JoinCond
  292.     PARAMETERS m.wzsArea,m.wzsFld
  293.     IF m.wzsFld='('
  294.         RETURN SUBSTR(m.wzsFld,2,LEN(m.wzsFld)-2)
  295.     ELSE
  296.         RETURN m.wzsArea+"."+m.wzsFld
  297.     ENDIF && m.wzsFld='('
  298.     RETURN
  299. ENDPROC
  300.  
  301.  
  302. PROCEDURE BuildInnerJoin
  303.     PARAMETERS aJoinInfo, aTables, index
  304.     DIMENSION aJoinInfo[ALEN(aJoinInfo,1),ALEN(aJoinInfo,2)]
  305.     
  306.     IF ALEN(aJoinInfo,1) == index
  307.         * end of recursion, build join string for <index> level
  308.         m.lcJoinStr = aTables[index-1] + " " + aJoinInfo[index-1,1] + " INNER JOIN " + ;
  309.                       aTables[index] + " " + aJoinInfo[index,1]
  310.     ELSE
  311.         * build join string from <index> level down
  312.         m.lcJoinStr = aTables[index-1] + " " + aJoinInfo[index-1,1] + " INNER JOIN " + ;
  313.                       "(" + BuildInnerJoin(@aJoinInfo, @aTables, index+1) + ")"
  314.     ENDIF
  315.     
  316.     * build join condition
  317.     m.lcJoinStr = m.lcJoinStr + " ON " + ;
  318.                   JoinCond(aJoinInfo[index,3], aJoinInfo[index,4]) + " = " + ;
  319.                   JoinCond(aJoinInfo[index,1], aJoinInfo[index,2])
  320.                   
  321.     RETURN m.lcJoinStr
  322. ENDPROC
  323.  
  324.  
  325. PROCEDURE OutStr
  326.     *OutStr watching for Quotes
  327.     PARAMETERS m.wzsPref,m.wzsStr,m.wzii,m.wzsMode,m.wzsSep
  328.     private m.wzii,m.wziLen
  329.  
  330.     DO WHILE LENC(m.wzsStr)>0
  331.         m.wziLen=IIF(m.wzlTesting,70,70)
  332.         IF TYPE("m.wzsMode")='N'
  333.             DO CASE
  334.             CASE m.wzsMode=0    && sequential "* FIELDS =" or "SET FIELDS TO "
  335.                 \<<m.wzsPref>>
  336.             CASE m.wzsMode=1    && line continuation, with ';' at the end
  337.                 IF m.wzii>0
  338.                     * The following line and others have 4 spaces on it... For 3.0a they had a Tab char
  339.                     * which causes some back ends to break
  340.                     \    
  341.                 ENDIF
  342.             ENDCASE
  343.             IF LENC(m.wzsStr)>m.wziLen AND AT_C(m.wzsSep,m.wzsStr)>0
  344.                 m.wziLen=RATC(m.wzsSep,LEFTC(m.wzsStr,m.wziLen))
  345.                 IF m.wziLen=0
  346.                     m.wziLen=ATC(m.wzsSep,m.wzsStr)
  347.                 ENDIF
  348.                 \\<<LEFTC(m.wzsStr,m.wziLen-(1-m.wzsMode))>>
  349.             ELSE
  350.                 \\<<m.wzsStr>>
  351.             ENDIF
  352.             IF m.wzsMode=1    &&trailing ; for line continuation
  353.                 \\;
  354.             ENDIF
  355.         ELSE
  356.             \<<m.wzsPref>>=
  357.             IF m.wzii>0
  358.                 \\m.<<m.wzsPref>>+
  359.             ENDIF
  360.             IF "'"$LEFTC(m.wzsStr,m.wziLen)
  361.                 IF '"'$LEFTC(m.wzsStr,AT_C("'",m.wzsStr)-1)
  362.                     m.wziLen=AT_C('"',m.wzsStr)
  363.                     \\'<<LEFTC(m.wzsStr,m.wziLen)>>'
  364.                 ELSE
  365.                     m.wziLen=ATC("'",m.wzsStr)
  366.                     \\"<<LEFTC(m.wzsStr,m.wziLen)>>"
  367.                 ENDIF
  368.             ELSE
  369.                 \\'<<LEFTC(m.wzsStr,m.wziLen)>>'
  370.             ENDIF
  371.         ENDIF
  372.         m.wzsStr=SUBSTRC(m.wzsStr,m.wziLen+1)
  373.         m.wzii=m.wzii+1
  374.     ENDDO
  375. RETURN
  376.